/*
 * @Description：Analog UART
 * @Version： 1.0
 * @Autor： lzc
 * @Date： 2022-01-04 15：02：40
 * @LastEditors: lzc
 * @LastEditTime: 2022-01-05 12:46:25
 */
#include "AnalogUart.h"

#define BuadRate_9600 100   //一个停止位为104us
#define CPU_FREQUENCY_MHZ 8 //时钟主频

char AnalogUART_Recv_State = COM_STOP_BIT;

AnalogUart_Data_Struct_t AnalogUart_Data_Struct; // 模拟串口结构体

/*********************************Init************************************/
void AnalogUart_Init_Struct(void)
{
    memset(&AnalogUart_Data_Struct, 0, sizeof(AnalogUart_Data_Struct));
    AnalogUart_Data_Struct.USART_recvData = 0;
    AnalogUart_Data_Struct.USART_Timeout = 50;
}
/*****************************Interface************************************/
// 模拟串口：发送TXD接口
void TXD_SetPin_Interface(char Pinstate)
{
    if (Pinstate == 1)
        HAL_GPIO_WritePin(Analog_UART_TX_GPIO_Port, Analog_UART_TX_Pin, GPIO_PIN_SET);
    else
        HAL_GPIO_WritePin(Analog_UART_TX_GPIO_Port, Analog_UART_TX_Pin, GPIO_PIN_RESET);
}

// 模拟串口：接受RXD接口(设置为下降沿中断)
char RXD_GetPin_Interface(void)
{
    char PinState = 0;
    PinState = HAL_GPIO_ReadPin(Analog_UART_RX_GPIO_Port, Analog_UART_RX_Pin);
    return PinState;
}

// 定时器使能接口
void TIM_Enable_Interface(void)
{
    __HAL_TIM_SET_COUNTER(&htim6, 0);
    __HAL_TIM_CLEAR_FLAG(&htim6, TIM_FLAG_UPDATE);
    HAL_TIM_Base_Start_IT(&htim6);
}

// 定时器失能接口
void TIM_Disable_Interface(void)
{
    HAL_TIM_Base_Stop_IT(&htim6); //关闭定时器
}

// 超时定时器使能接口
void TIM_TimeOut_Enable_Interface(void)
{
    __HAL_TIM_SET_COUNTER(&htim14, 0);
    __HAL_TIM_CLEAR_FLAG(&htim14, TIM_FLAG_UPDATE);
    HAL_TIM_Base_Start_IT(&htim14);
}

// 超时定时器失能接口
void TIM_TimeOut_Disable_Interface(void)
{
    HAL_TIM_Base_Stop_IT(&htim14); //关闭定时器
}

// 获取超时定时器状态以及刷新定时器值
void TIM_TimeOut_Reflash_Interface(void)
{
    char myState = 0;
    // 如果超时定时器没有初始化，则开启定时器
    myState = HAL_TIM_Base_GetState(&htim14);
    if (myState == HAL_TIM_STATE_READY)
    {
        TIM_TimeOut_Enable_Interface();
    }
    else if (myState == HAL_TIM_STATE_BUSY)
    {
        __HAL_TIM_SET_COUNTER(&htim14, 0);
        __HAL_TIM_CLEAR_FLAG(&htim14, TIM_FLAG_UPDATE);
    }
}
/*****************************Tick Delay************************************/

// STM32 滴答定时器
// void Tick_delay_us(__IO uint32_t delay)
// {
//     int last, curr, val;
//     int temp;
//     while (delay != 0)
//     {
//         temp = delay > 900 ? 900 : delay;
//         last = SysTick->VAL;
//         curr = last - CPU_FREQUENCY_MHZ * temp;
//         if (curr >= 0)
//         {
//             do
//             {
//                 val = SysTick->VAL;
//             } while ((val < last) && (val >= curr));
//         }
//         else
//         {
//             curr += CPU_FREQUENCY_MHZ * 1000;
//             do
//             {
//                 val = SysTick->VAL;
//             } while ((val <= last) || (val > curr));
//         }
//         delay -= temp;
//     }
// }

// 死循环等待
void Tick_delay_us(uint32_t us)
{
    uint32_t delay = ((2 * us) + 60);
    while (delay--)
    {
        ;
    }
}
/******************************TXD************************************/

void IO_TXD(char Data)
{
    char i = 0;
    TXD_SetPin_Interface(0);
    Tick_delay_us(BuadRate_9600);
    for (i = 0; i < 8; i++)
    {
        if (Data & 0x01)
            TXD_SetPin_Interface(1);
        else
            TXD_SetPin_Interface(0);
        Tick_delay_us(BuadRate_9600);
        Data = Data >> 1;
    }
    TXD_SetPin_Interface(1);
    Tick_delay_us(BuadRate_9600);
}

// 模拟串口：数据发送
void USART_Send(char *buf, char len)
{
    char t;
    for (t = 0; t < len; t++)
    {
        IO_TXD(buf[t]);
    }
}
/*******************************RXD***********************************/
// 放置于RX引脚的中断服务函数中
void AnalogUart_EXIT_Handler(void)
{
    if (RXD_GetPin_Interface() == 0)
    {
        if (AnalogUART_Recv_State == COM_STOP_BIT)
        {
            AnalogUART_Recv_State = COM_START_BIT;
            TIM_Enable_Interface();
        }
        TIM_TimeOut_Reflash_Interface();
    }
}

// 放置于RXD开启的定时器的中断服务函数中，1MHZ计时次数，100重载值，不进行自动重载。
void AnalogUart_IO_TIM_Handler(void)
{
    AnalogUART_Recv_State++;
    if (AnalogUART_Recv_State == COM_STOP_BIT)
    {
        TIM_Disable_Interface();
        AnalogUart_Data_Struct.USART_buf[AnalogUart_Data_Struct.USART_len++] =
            AnalogUart_Data_Struct.USART_recvData;
        return;
    }
    if (RXD_GetPin_Interface())
    {
        AnalogUart_Data_Struct.USART_recvData |= (1 << (AnalogUART_Recv_State - 1));
    }
    else
    {
        AnalogUart_Data_Struct.USART_recvData &= ~(1 << (AnalogUART_Recv_State - 1));
    }
}
/*******************************不定长接受***********************************/

// 放置于不定长接受定时器的中断服务函数中，1MHZ计时次数，999重载值，不进行自动重载。
void AnalogUart_TimeOut_TIM_Handler(void)
{
    AnalogUart_Data_Struct.USART_Timeout--;
    // 不定长接收完成
    if (AnalogUart_Data_Struct.USART_Timeout == 0)
    {
        TIM_TimeOut_Disable_Interface();
        AnalogUART_Recv_State = COM_STOP_BIT;
        AnalogUart_Data_Struct.USART_Timeout = 50;
        AnalogUart_Data_Struct.USART_Rx_Done = 1;
        AnalogUart_Data_Struct.USART_recvData = 0;
    }
}

// Example:
// void main()
// {
//     while (1)
//     {
//         if (AnalogUart_Data_Struct.USART_Rx_Done == 1)
//         {
//             USART_Send(AnalogUart_Data_Struct.USART_buf, AnalogUart_Data_Struct.USART_len);
//             AnalogUart_Data_Struct.USART_len = 0;
//             AnalogUart_Data_Struct.USART_Rx_Done = 0;
//         }
//     }
// }
